#ifndef MODELMSG_H
#define MODELMSG_H

#pragma once

#include <QString>
#include <QVariant>
#include "doublepair.h"
#include <QDateTime>
#include "gtime.h"

namespace ns_yht
{

    namespace AlertLevel
    {
        const int caution = 0;
        const int warning = 1;
        const int alarm = 2;
    }

    // 1-99 caution  ; 100-199 warning  ; 200-299 alarm //好像没用这个分段
    namespace AlertType
    {
        const int type_none = 0;
        const int type_device_lose = 201;   // 设备失效      ID-设备识别号
        const int type_device_recover = 2;  // 设备恢复      ID-设备识别号
        const int type_efence = 111;        // 电子围栏      ID-0 //暂时
        const int type_shipCollision = 222; // 会遇,yhtc中对应紧急报警会遇          ID-船舶MMSI
        // const int type_shipCollision_cancel = 21;     // 会遇取消      ID-船舶MMSI
        const int type_shipCollision_low = 223;       // yhtc中的预警报警会遇          ID-船舶MMSI
        const int type_shipCollision_low_cancel = 22; // 会遇取消      ID-船舶MMSI
        const int type_anchorDragging = 231;          // 走锚          ID-0
        const int type_offroute = 141;                // 距离偏航      ID-0
        // const int type_offroute_cancel = 42;          // 距离偏航恢复  ID-0
        const int type_offrouteCourse = 143; // 方向偏航      ID-0
        // const int type_offrouteCourse_cancel = 44;    // 方向偏航恢复  ID-0
        const int type_poi_alarm = 151; // 碍航物        ID-碍航物类型组合ID
        // const int type_poi_cancel = 52;            // 碍航物恢复    ID-0 //碍航物恢复就用报警消息中的取消，同走锚
        const int type_poi_warning = 152; // 碍航物警告    ID-碍航物类型组合ID
        const int type_depth = 153;       // 水深          ID-0
        // const int type_depth_cancel = 54;     // 水深恢复      ID-0
        const int type_nearWaypoint = 161;    // 接近和抵达航路点    ID-航路点索引
        const int type_nearDestination = 162; // 接近和抵达目的地    ID-0
        const int type_usermap = 171;         // 用户海图警报
        // const int type_usermap_cancel = 72;   // 没有了用户海图
        const int type_duty_normal = 181;    // 值守报警，到间隔了没有点值守确认，预警报警
        const int type_duty_emergency = 182; // 超过值守确认时间1分钟，紧急报警
        const int type_riskarea = 191;       // 危险区域
    }

    namespace AlertPoiType
    {
        const int dangerousObject = 1; // 危险物
        const int navMark = 2;         // 航标
        const int safetyContour = 4;   // 安全等深线
        const int land = 8;            // 陆地

        const int channelSeperate = 1; // 航道分隔带
        const int alongChannel = 2;    // 沿岸通航带
        const int careful = 4;         // 小心警惕
        const int military = 8;        // 军事演习区
        const int airport = 16;        // 水上机场
        const int anchor = 32;         // 锚地
        const int farm = 64;           // 海上养殖农场
        const int limit = 128;         // 限制区
        const int diving = 256;        // 潜艇通过道
        const int production = 512;    // 海上生产区域
    }

    struct ModelMsg
    {
        int id{0};    // 对应数据库中自增ID，为0表示未保存
        qint64 ID{0}; // 判断是否是同一个事情生成的消息，会遇（mmsi）
        int type{0};  // 参考AlertType定义
        // int level{AlertLevel::caution};  // 0-caution 1-warning 2-alarm
        int shapeType{0};       // 0-点 1-线 2-面 3-圆形
        DoublePairs shapeCoors; // 点、线、面的坐标
        double radius{0};       // 圆形时的半径，米
        bool expired{false};    // 是否过期
        QString msg;            // 内容
        qint64 time{0};         // 生成时间
        qint64 expiredTime{0};  // 过期时间
        bool isEnsured{false};  // 是否已确认
        qint64 ensureTime{0};   // 确认时间
        bool outAlarm{false};   // 是否调用外部喇叭报警
        qint64 voiceTime{0};    // 上次播报时间
        int voiceTimes{0};      // 已经播报次数

        QVariant target;

        QString toString() const { return QString("%1 %2").arg(GTime::getLocalTimeFromUtc(time).toString("hh:mm:ss"), msg); }
        QString typeName() const
        {
            switch (type)
            {
            case AlertType::type_none:
                return "未知";
            case AlertType::type_device_lose:
                return "设备失效";
            case AlertType::type_device_recover:
                return "设备恢复";
            case AlertType::type_efence:
                return "电子围栏";
            case AlertType::type_shipCollision:
                return "会遇";
            // case AlertType::type_shipCollision_cancel:
            // return "会遇取消";
            case AlertType::type_anchorDragging:
                return "走锚";
            case AlertType::type_offroute:
                return "距离偏航";
            // case AlertType::type_offroute_cancel:
            // return "距离偏航恢复";
            case AlertType::type_offrouteCourse:
                return "方向偏航";
            // case AlertType::type_offrouteCourse_cancel:
            // return "方向偏航恢复";
            case AlertType::type_poi_alarm:
                return "碍航物警报";
            case AlertType::type_poi_warning:
                return "碍航物警告";
            case AlertType::type_depth:
                return "水深";
            // case AlertType::type_depth_cancel:
            // return "水深恢复";
            case AlertType::type_nearWaypoint:
                return "接近抵达航路点";
            case AlertType::type_nearDestination:
                return "接近抵达目的地";
            case AlertType::type_duty_normal:
            case AlertType::type_duty_emergency:
                return "值守报警";
            default:
                return "未知";
            }
        }
    };

} //  namespace ns_yht
#endif // MODELMSG_H